﻿using System;
using System.Collections.Generic;
using System.Data.SQLite;
using System.Linq;
using System.Reflection;
using LogHelper.SQLiteORM.Internal;

namespace LogHelper.SQLiteORM.Generic
{
    /// <summary>
    /// 1、每个字段（包括主键）必须使用ColumnAttribute进行标记，指定数据库数据类型。
    /// 2、主键必须使用PrimaryKeyAttribute进行标记，而且每个实体必须有一个主键。  
    /// 3、一般的实体名即表名，可以指定Name属性进行重命名                           
    /// 4、需要手动调用<see cref="Initialize"/>创建表                                                        
    /// </summary>
    public class SqLite : IDisposable
    {
        private class DefaultValue
        {
            public string Table { get; set; }

            public string Column { get; set; }

            public object Value { get; set; }
        }

        private readonly SQLiteConnection _connection;

        public SqLite(SQLiteConnection conn)
        {
            _connection = conn;
        }

        ///<summary>
        /// 初始化数据库模型
        /// </summary>
        public void Initialize(params Type[] models)
        {
            foreach (var sql in models.Select(type => type.CreateSql(DataTypeMapper)))
            {
                new SQLiteCommand(sql, _connection).ExecuteNonQuery();
            }

        }

        /// <summary>
        /// 插入一个实体
        /// </summary>
        /// <typeparam name="TEntity"></typeparam>
        /// <param name="entity"></param>
        /// <returns></returns>
        public int Insert<TEntity>(TEntity entity) where TEntity : new()
        {
            var paramsValue = new List<SQLiteParameter>();

            //Console.WriteLine(entity.GetType());
            var sql = entity.InsertSql(paramsValue);
            var cmd = new SQLiteCommand(sql, _connection);
            cmd.Parameters.AddRange(paramsValue.ToArray());
            return cmd.ExecuteNonQuery();
        }


        public virtual string DataTypeMapper(MemberInfo property, string @default)
        {
            return @default;
        }

        public void Dispose()
        {
            _connection?.Close();
        }
    }
}